/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package desarrollosoft.ghce.vista.implementaciones;

import desarrollosoft.ghce.entidades.Paciente;
import desarrollosoft.ghce.entidades.Plantilla;
import desarrollosoft.ghce.servicio.interfaces.IResultadoOperacion;
import desarrollosoft.ghce.servicio.interfaces.IServicioHistorial;
import desarrollosoft.ghce.soporte.SecurityUtil;
import desarrollosoft.ghce.vista.interfaces.Actualizable;
import desarrollosoft.ghce.vista.interfaces.Avisable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.zkoss.bind.annotation.BindingParam;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zk.ui.Execution;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Window;

/**
 *
 * @author ariel
 */
@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class ControladoraVentanaPedidoEstudioLaboratorio implements Avisable {
    
    @WireVariable("servicioHistorial")
    IServicioHistorial servicioHistorial;
    
    private Paciente paciente;
    private Actualizable actualizable;
    private String nombreUsuarioActual;
    
    private String textoBuscar;
    private List<Plantilla> listaPlantillas;
    private List<Plantilla> listaPlantillasElegidas;
    
    @Init
    public void inicializar() {
        Execution ejecucion = Executions.getCurrent();
        paciente = (Paciente) ejecucion.getArg().get("paciente");
        actualizable = (Actualizable) ejecucion.getArg().get("actualizable");
        nombreUsuarioActual = SecurityUtil.getUserName();
        
        listaPlantillas = servicioHistorial.traerTodasPlantillas();
        listaPlantillasElegidas = new ArrayList<>();
    }
    
    @NotifyChange("listaPlantillas")
    @Command("buscar")
    public void clickBotonBuscar() {
        if (textoBuscar == null || textoBuscar.length() == 0) {
            listaPlantillas = servicioHistorial.traerTodasPlantillas();
        } else {
            listaPlantillas = servicioHistorial.traerTodasPlantillas(textoBuscar); 
        }
    }
    
    @Command("checkearon")
    public void checkearonAlguno(
            @BindingParam("checkeado") boolean checkeado,
            @BindingParam("plantilla") Plantilla plantilla ) {
        
        if (checkeado) { // tildaron
            if (!listaPlantillasElegidas.contains(plantilla)) {
                listaPlantillasElegidas.add(plantilla);
            }
        } else { // destildaron
            if (listaPlantillasElegidas.contains(plantilla)) {
                listaPlantillasElegidas.remove(plantilla);
            }
        }
    }
    
    @Command("guardar")
    public void clickBotonGuardar() {
        try {
            IResultadoOperacion resultado = 
                    servicioHistorial.tratarDeCrearEstudios(listaPlantillasElegidas, paciente, nombreUsuarioActual);
            List<Plantilla> listaPlantillasAconfirmar = resultado.obtenerPlantillasAconfirmar();
            List<Plantilla> listaPlantillasCorrectas = resultado.obtenerPlantillasCorrectas();
            if (listaPlantillasAconfirmar.isEmpty()) {
                String mensaje = "Se pidieron correctamente los estudios solictados";
                Messagebox.show(mensaje);
                actualizable.guardaronVentanaHija(new Object()); // para que sea != null
            } else {
                Map<String, Object> argumentos = new HashMap<>();
                argumentos.put("listaPlantillasConfirmar", listaPlantillasAconfirmar);
                argumentos.put("listaPlantillasCorrectas", listaPlantillasCorrectas);
                argumentos.put("paciente", paciente);
                argumentos.put("avisable", this);
                Window ventana = (Window) Executions.createComponents("VentanaConfirmacionPedidoEstudio.zul", null, argumentos);
                ventana.doModal();
            }
        } catch (Exception ex) {
            Messagebox.show(ex.toString()); // deberia pasar por el parser
            actualizable.guardaronVentanaHija(null);
        }
    }
    
    @Command("cancelar")
    public void clickBotonCancelar() {
        actualizable.cancelaron();
    }

    public String getTextoBuscar() {
        return textoBuscar;
    }

    public void setTextoBuscar(String textoBuscar) {
        this.textoBuscar = textoBuscar;
    }

    public List<Plantilla> getListaPlantillas() {
        return listaPlantillas;
    }

    @Override
    public void seCerroVentanaHija(String nombre) {
        // unicamente llamado cuando se cierra ventana de confirmacion de pedidos
        actualizable.guardaronVentanaHija(new Object()); // para que sea != null
    }
    
    
}
